#include "algoritmos.h"


long saaLinha(char *linha, char *padrao, int numLinha, int erro, int* ocorrencias) {
  int n = strlen(linha);
  int m = strlen(padrao);
  long Masc[MAX_CHAR];
  long i, j, Ri, Rant, Rnovo;
  long R[NUM_ERROS + 1];
  long comp = 0;
  *ocorrencias = 0;

  // pre-processamento
  for (i=0; i<MAX_CHAR; i++) {
      Masc[i] = 0;
  }
  for (i=1; i<=m; i++) {
      Masc[padrao[i-1] + 127] |= 1 << (m - i);
  }
  
  R[0] = 0;
  Ri = 1 << (m - 1);
  
  for (j = 1; j<=erro; j++) {
      R[j] = (1 << (m-j)) | R[j-1];
  }    
  
  // busca
  for (i=0; i<n; i++) {
    Rant = R[0];
    Rnovo = ((((unsigned long)Rant) >> 1) | Ri) & Masc[linha[i] + 127];
    R[0] = Rnovo;
    
    for (j = 1; j<=erro; j++) {
      Rnovo = ((((unsigned long)R[j]) >> 1) & Masc[linha[i] + 127]) | Rant | (((unsigned long)(Rant | Rnovo)) >> 1);
      Rant = R[j];
      R[j] = Rnovo | Ri;
    }
    if ((Rnovo & 1) != 0) {
       if (!ANALISE) imprimeResultado(linha, padrao, numLinha, i-(strlen(padrao))+2);
       (*ocorrencias)++;
    }
    comp = comp + 1 + erro;
  }

  return comp;
}

long saaTexto(char **texto, char *padrao, int nLinhasTexto, int linhaInicial, int erro, float* tempo, int* ocorrencias) {
    long comparacoes = 0;
    int i=0;
    int ocorrenciasLinha = 0;
    *ocorrencias = 0;
   
    clock_t inicio, fim;
    inicio = clock();
    
    for (i=0; i<nLinhasTexto; i++) {
        char *linha = texto[i];
        comparacoes += saaLinha(linha, padrao, linhaInicial, erro, &ocorrenciasLinha);
        linhaInicial++;
        *ocorrencias += ocorrenciasLinha;
    }
    
    fim = clock();
    *tempo = ( (float)fim -(float)inicio ) / ( (float)CLOCKS_PER_SEC );
    
    return comparacoes;
}
